/**************************************************************************//**
 * @item     CosyOS-III 例程（服务应用）
 * @file     event_group.c
 * @brief    事件同步_事件标志组
 * @details  通过事件标志组的相关应用，实现对一类事件的事件同步。
 * @note     某一类事件，它的发生线程可能会有多个，均同步至同一个事件处理线程中
             统一处理该类事件。
 * @author   迟凯峰
 * @version  V1.0.0
 * @date     2025.10.22
 ******************************************************************************/

#if 1 /* 编译开关 */

#include "CosyOS.H"

uExternFlagGroup // 声明事件标志组（必须声明）
(
    group_1, // 组名
    uDefFlagBit(bit_1); // 位名
    uDefFlagBit(bit_2);
    uDefFlagBit(bit_3);
    uDefFlagBit(bit_4);
    uDefFlagBit(bit_5);
    uDefFlagBit(bit_6);
    uDefVoidBits(2);
);
uCreateFlagGroup(group_1); // 创建事件标志组

/**
 * \brief    task_1
 * \details  统一处理group_1事件。
 * \note     按自定义优先级依次查询各标志位，为真就清除标志位而后处理事件。
 */
uCreateTask(task_1, 5, 384, 0, 0)
{
    while(1){
        if(uWaitFlagGroup(group_1, ~0)){ // 等待标志组为真
            if(group_1.bit_1){ // 查询标志位
                uClearFlagBit(group_1, bit_1); // 清除标志位
                /* 处理bit_1事件 开始 */
                
                /* 处理bit_1事件 结束 */
            }
            else if(group_1.bit_2){
                uClearFlagBit(group_1, bit_2);
                /* 处理bit_2事件 开始 */
                
                /* 处理bit_2事件 结束 */
            }
            else if(group_1.bit_3){
                uClearFlagBit(group_1, bit_3);
                /* 处理bit_3事件 开始 */
                
                /* 处理bit_3事件 结束 */
            }
            else if(group_1.bit_4){
                uClearFlagBit(group_1, bit_4);
                /* 处理bit_4事件 开始 */
                
                /* 处理bit_4事件 结束 */
            }
            else if(group_1.bit_5){
                uClearFlagBit(group_1, bit_5);
                /* 处理bit_5事件 开始 */
                
                /* 处理bit_5事件 结束 */
            }
            else if(group_1.bit_6){
                uClearFlagBit(group_1, bit_6);
                /* 处理bit_6事件 开始 */
                
                /* 处理bit_6事件 结束 */
            }
        }
    }
}

/**
 * \brief    task_2
 * \details  先处理自身事务，再同步至task_1 统一处理group_1事件。
 */
uCreateTask(task_2, 2, 384, 0, 0)
{
    while(1){
        /* 处理自身事务 开始 */
        
        /* 处理自身事务 结束 */
        /* 同步至task_1 开始 */
        uSetFlagBit(group_1, bit_1); // 设置标志位
        uSetFlagBits(group_1, 2) bit_2, bit_3); // 设置多标志位
        uClearBlock(task_1); // 清除阻塞
        /* 同步至task_1 结束 */
        uDelay_s(3);
    }
}

/**
 * \brief    某中断
 * \details  先对事件做必要的紧急处理，再同步至task_1 统一处理group_1事件。
 */
void XXXx_IRQHandler(void) // interrupt XXXx_VECTOR
{
    /* 清中断标志位 开始 */
    
    /* 清中断标志位 结束 */
    /* 紧急处理事件 开始 */
    
    /* 紧急处理事件 结束 */
    /* 同步至task_1 开始 */
    iSetFlagBit(group_1, bit_4); // 设置标志位
    iSetFlagBits(group_1, 2) bit_5, bit_6); // 设置多标志位
    iClearBlock(task_1); // 清除阻塞
    /* 同步至task_1 结束 */
}

/** 启动钩子 */
void start_hook(void)
{
    uStartTask_Ready(task_1); // 启动task_1，初始状态为就绪状态
    uStartTask_Ready(task_2); // 启动task_2，初始状态为就绪状态
}

#endif
